# This is the serializer for the User model.
from rest_framework import serializers
from casedemo14_userSer.models import CaseDemo14User,CaseDemo14UserRole


class CaseDemo14UserSerializerDemo1(serializers.ModelSerializer):
    useronlyID=serializers.IntegerField(read_only=True)# 设置的是允许可读
    uuid = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    username = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    realname = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    card = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    password = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    sex = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    age = serializers.IntegerField(required=False, allow_null=True)
    email = serializers.EmailField(required=False, allow_blank=True, allow_null=True)
    phone = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    vxinfo = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    address = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    status = serializers.IntegerField(required=False, allow_null=True)
    descrption = serializers.CharField(required=False, allow_blank=True, allow_null=True)
    create_time = serializers.DateTimeField(required=False, allow_null=True)
    update_time = serializers.DateTimeField(required=False, allow_null=True)
    """
        required=False	表示这个字段是可选的（可以不传）
        allow_blank=True	允许传空字符串 ""（适用于 CharField）
        allow_null=True	允许传 null（适用于所有字段）
    """
    #role=serializers.PrimaryKeyRelatedField(queryset=CaseDemo14UserRole.objects.all(),many=True,required=False, allow_null=True)
    """
    序列化（读数据）时：把 role 外键字段序列化为它的主键 ID。

    反序列化（接收数据）时：允许传入一个 ID（如："role": 1），并自动转换为 Role 实例。
    """

    role = serializers.HyperlinkedRelatedField(
        view_name='role-detail',
        queryset=CaseDemo14UserRole.objects.all(),
        many=True
    )
    """
    参数名	说明
    view_name	生成 URL 所用的视图名（必须）
    queryset	用于反序列化验证的对象集合（必须）
    lookup_field	使用哪个字段查找对象（默认是 pk）
    many=True	如果是多对多关系，需加上
    read_only=True	如果只用于输出
    """
    class Meta:
        model = CaseDemo14User
        fields = '__all__'

class CaseDemo14UserRoleSerializerDemo1(serializers.ModelSerializer):
       # 你可以选择性地指定字段参数
    role = serializers.IntegerField(required=True)
    remark = serializers.CharField(required=False, allow_blank=True, max_length=100)
    create_time = serializers.DateTimeField(read_only=True)
    update_time = serializers.DateTimeField(read_only=True)

    # 实现验证的功能
    """
    def validate_role(self, value):
        if value not in [0, 1, 2]:
            raise serializers.ValidationError("角色类型只能是1,2,3")
        return value
    """

    def validate(self, attrs):
         # 如果是更新，则 self.instance 有值；否则是创建
         instance = self.instance
         if instance:
             # 数据类型必须是0,1,2
             if attrs['role'] not in [0, 1, 2]:
                 raise serializers.ValidationError("角色类型只能是1,2,3")
         else:
             # 创建时，数据类型必须是0,1,2
             if attrs['role'] not in [0, 1, 2]:
                 raise serializers.ValidationError("角色类型只能是1,2,3")
         return attrs

    class Meta:
        model = CaseDemo14UserRole
        fields = '__all__'




class CaseDemo14UserRoleSerializerDemo4(serializers.ModelSerializer):
    class Meta:
        model = CaseDemo14UserRole
        fields = '__all__'











######举例子，举个简单的例子
from rest_framework import serializers
from .models import Classroom, Student
# 教室序列化器，用于将 Classroom 模型数据转换为 JSON，以及从 JSON 转换为模型数据
class ClassroomSerializer(serializers.ModelSerializer):
    class Meta:
        model = Classroom  # 绑定的模型是 Classroom
        fields = '__all__'  # 自动包含模型中的所有字段（即 room_number 和 floor）

# 学生序列化器，用于 Student 模型
class StudentSerializer(serializers.ModelSerializer):
    # classroom 是一个外键字段（关联 Classroom）
    # 我们用 SlugRelatedField 来让它在序列化/反序列化时显示/使用 room_number（而不是主键 ID）
    """
    classroom = serializers.SlugRelatedField(
        queryset=Classroom.objects.all(),  # 指定 classroom 字段可以选择的范围
        slug_field='room_number'  # 使用 Classroom 的 room_number 字段来表示这个外键
    )"""
    #classroom = serializers.PrimaryKeyRelatedField(queryset=Classroom.objects.all())

    classroom = serializers.HyperlinkedRelatedField(
        queryset=Classroom.objects.all(),
        view_name='classroom-detail'
    )

    class Meta:
        model = Student  # 绑定的模型是 Student
        fields = ['id', 'name', 'age', 'classroom']  # 明确指定要序列化的字段
